/* Copyright (c) [2025] [zhi1208@126.com]
 * SPDX-License-Identifier: MIT
 */

/*********************
 *      INCLUDES
 *********************/
#include <stdint.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>

#include "FreeRTOS.h"
#include "semphr.h"

#include "stm32f4xx_hal.h"
#include "usart.h"

/*********************
 *      DEFINES
 *********************/
#define LOG_BUF_SIZE 512

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/

/**********************
 *  STATIC VARIABLES
 **********************/
static char log_buf[LOG_BUF_SIZE];

/**********************
 *      MACROS
 **********************/

/**********************
 *   GLOBAL FUNCTIONS
 **********************/
SemaphoreHandle_t log_sem;

void bsp_log_init()
{
    log_sem = xSemaphoreCreateBinary();
    vQueueAddToRegistry(log_sem, "log_sem");
    xSemaphoreGive(log_sem);
}

void bsp_log(const char *fmt, ...)
{
    xSemaphoreTake(log_sem, portMAX_DELAY);

    memset(log_buf, 0, LOG_BUF_SIZE);

    va_list arg;
    va_start(arg, fmt);
    vsnprintf(log_buf, (int)LOG_BUF_SIZE, fmt, arg);
    va_end(arg);

    HAL_UART_Transmit_DMA(&huart1, (uint8_t *)log_buf, strlen(log_buf));
}

/**********************
 *   STATIC FUNCTIONS
 **********************/